package design.patterns.behavioral;

/**
 * 观察者模式
 * 解释：
 * 观察者模式是一种行为设计模式， 允许你定义一种订阅机制，
 * 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
 */

import java.util.ArrayList;
import java.util.List;

/**
 * 场景
 * 热爱电子产品的人(LoveProductsPerson)，商店(Store)
 * 热爱电子产品的人，会受到商店上新的通知。
 */
public class F_Observer {
    public static void main(String[] args) {
        LoveProductsPerson zhangSan = new LoveProductsPerson("张三");
        LoveProductsPerson liSi = new LoveProductsPerson("李四");
        LoveProductsPerson wangWu = new LoveProductsPerson("王五");

        Store apple = new Store("Apple");
        apple.addNotifyPeople(zhangSan);
        apple.addNotifyPeople(liSi);
        apple.addNotifyPeople(wangWu);

        /* 假设新品到货 */
        apple.notifyNewProductToPeople();
    }
}

/**-----
 * 主要类 商店（Stroe）， 人（LoveProductsPerson）
 * 商店中可以添加通知的人
 *
 * ps：省略了，发通知和收通知。仅以“文字输出”作为发出通知，默认收到。
 */
class Store{
    private String name;
    List<LoveProductsPerson> personList= new ArrayList<>();

    public Store(String name) {
        this.name = name;
    }

    void notifyNewProductToPeople(){
        personList.forEach(person->{
            sendMessage(person);
        });
    };

    void addNotifyPeople(LoveProductsPerson person){
        personList.add(person);
    }
    void sendMessage(LoveProductsPerson person){
        System.out.println("新品到了！ for"+person);
    }

    public String getName() {
        return name;
    }
}
class LoveProductsPerson{
    String name;

    public LoveProductsPerson(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}